/******************************************************************************/
/* File: utilClass.h                                                          */
/******************************************************************************/

#ifndef UTILCLASS_H
#define UTILCLASS_H

#include <map>
#include <list>
#include <time.h>
#include <pthread.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <iostream>

#define MILLION 1000000
#define BILLION 1000000000

/***********************************************************************/
/***********************************************************************/

// Kalman filter states
typedef struct KalmanState {
    double q; //process noise covariance
    double r; //measurement noise covariance
    double x; //value
    double p; //estimation error covariance
    double k; //kalman gain
} KalmanState;

// Signal 相关
typedef void Sigfunc(int);
typedef Sigfunc *SigfuncPtr;

/******************************************************************************/
/*
 UtilClass 主要定义了一系列的功能函数（均以静态函数的形式呈现）.
 主要包括：
 1. 延迟函数
 2. 格式转换
 3. 信号处理函数
 4. 加密函数(暂不做)
 */
/******************************************************************************/
class UtilClass {

public:    
    
    /***静态函数*****************************************************/
    // 延迟函数(微秒级)
    static void DelayLoop(unsigned long usecs);
    static void DelayNanosleep (unsigned long usec);
    static void DelayBusyloop (unsigned long usec);
    static void KalmanUpdate (KalmanState *state, double measurement);
    static void DelayKalman (unsigned long usec);
    
    // 时间处理函数
    static void TimevalAddLong (struct timeval *tv0, unsigned long value);
    static void TimespecAddLong (struct timespec *tv0, unsigned long value);
    static int TimevalGreaterThan(struct timeval tv1, struct timeval tv0);
    static double TimevalDiff (struct timeval tv1, struct timeval tv0);
    
    // 格式转换
    static long ByteAtoI(const char *inString);
    static void PatternBuffer(char *outBuf, int inBytes);
    
    // 调试使用
    static void DebugPrint(const char *debugInfo);
    
    // 信号处理
    /*
    在这里，我们简要介绍一下关于如何使用信号处理函数：
    1 明确需要处理的信号及信号处理函数，如 SIGINT <===> IntHandler()函数;
    2 定义自定义处理函数，如 void IntHandler();
    3 使用RegisterSignalHandler函数注册信号处理函数：
        RegisterSignalHandler(SIGINT, IntHandler);
    4 SigExit函数只是一个功能函数，用于安静退出程序（可以在IntHandler函数中使用）
    备注：后面需要实现的信号退出函数功能：
        * 安全销毁线程
        * 完成消息的通知（比如，服务器关闭，信息统计打印等等）
        * 调用SigExit安静退出程序
    */
    static SigfuncPtr RegisterSignalHandler( int inSigno, SigfuncPtr inFunc );
    static void SigExit( int inSigno );
};

#endif

/******************************************************************************/
/* End File: utilClass.h                                                      */
/******************************************************************************/